]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st/texture-cache: Move icon theme lookup out of the hot path
authorIvan Molodetskikh <yalterz@gmail.com>
Tue, 5 Jan 2021 13:45:55 +0000 (16:45 +0300)
committerIvan Molodetskikh <yalterz@gmail.com>
Tue, 5 Jan 2021 13:50:59 +0000 (16:50 +0300)
It was showing up on profile traces over at
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1547#note_996417
After this change it no longer does.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1558>

src/st/st-texture-cache.c

index 744acd509f65f5bd1679bc6376aaad895d782471..89620706cb75d41574e8cf338576940938c344e4 100644 (file)
@@ -974,7 +974,6 @@ st_texture_cache_load_gicon (StTextureCache    *cache,
   g_autofree char *key = NULL;
   float actor_size;
   GtkIconTheme *theme;
-  GtkIconInfo *info;
   StTextureCachePolicy policy;
   StIconColors *colors = NULL;
   StIconStyle icon_style = ST_ICON_STYLE_REQUESTED;
@@ -1014,11 +1013,6 @@ st_texture_cache_load_gicon (StTextureCache    *cache,
     lookup_flags |= GTK_ICON_LOOKUP_DIR_LTR;
 
   scale = ceilf (paint_scale * resource_scale);
-  info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, icon,
-                                                   size, scale,
-                                                   lookup_flags);
-  if (info == NULL)
-    return NULL;
 
   gicon_string = g_icon_to_string (icon);
   /* A return value of NULL indicates that the icon can not be serialized,
@@ -1046,14 +1040,21 @@ st_texture_cache_load_gicon (StTextureCache    *cache,
 
   actor = create_invisible_actor ();
   clutter_actor_set_size (actor, actor_size, actor_size);
-  if (ensure_request (cache, key, policy, &request, actor))
-    {
-      /* If there's an outstanding request, we've just added ourselves to it */
-      g_object_unref (info);
-    }
-  else
+  if (!ensure_request (cache, key, policy, &request, actor))
     {
       /* Else, make a new request */
+      GtkIconInfo *info;
+
+      info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, icon,
+                                                       size, scale,
+                                                       lookup_flags);
+      if (info == NULL)
+        {
+          g_hash_table_remove (cache->priv->outstanding_requests, key);
+          texture_load_data_free (request);
+          g_object_unref (actor);
+          return NULL;
+        }
 
       request->cache = cache;
       /* Transfer ownership of key */